package top.luckyluxcis.api;

import lombok.experimental.UtilityClass;
import top.luckyluxcis.RollApi;
import top.luckyluxcis.consts.HolidayType;
import top.luckyluxcis.type.Festival;
import top.luckyluxcis.type.Holiday;
import top.luckyluxcis.util.MapUtil;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * 获取指定日期、按年、按月的节假日和万年历信息
 *
 * @author Zhuang
 * @since 2023/9/20
 */
@SuppressWarnings("unused")
@UtilityClass
public class HolidayUtil {
    private static final RollApi API = RollApi.getInstance();

    /**
     * 获取指定日期的节假日及万年历信息
     *
     * @param date          日期 格式 yyyyMMdd
     * @param ignoreHoliday 是否忽略节假日，仅仅获取万年历，默认值false
     * @return {@link Holiday}
     */
    public static Holiday single(boolean ignoreHoliday, String date) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("ignoreHoliday", ignoreHoliday)
                .build();
        return API.get("/holiday/single/" + date, params, Holiday.class);
    }

    /**
     * 获取指定多个日期的节假日及万年历信息
     *
     * @param dates         日期组 格式 yyyyMMdd,yyyyMMdd,yyyyMMdd （中间用英文逗号隔开）
     * @param ignoreHoliday 是否忽略节假日，仅仅获取万年历，默认值false
     * @return {@link List}<{@link Holiday}>
     */
    public static List<Holiday> multi(boolean ignoreHoliday, String... dates) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("ignoreHoliday", ignoreHoliday)
                .build();
        return API.get("/holiday/multi/" + String.join(",", Arrays.asList(dates)), params, List.class, Holiday.class);
    }

    /**
     * 获取指定月份的节假日及万年历信息
     *
     * @param date          查询的月份 格式 yyyyMM （只有年月）
     * @param ignoreHoliday 是否忽略节假日，仅仅获取万年历，默认值false
     * @return {@link List}<{@link Holiday}>
     */
    public static List<Holiday> listMonth(boolean ignoreHoliday, String date) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("ignoreHoliday", ignoreHoliday)
                .build();
        return API.get("/holiday/list/month/" + date, params, List.class, Holiday.class);
    }

    /**
     * 获取指定年份的节假日及万年历信息
     *
     * @param date          查询的年份 格式 yyyy （只有年份）
     * @param ignoreHoliday 是否忽略节假日，仅仅获取万年历，默认值false
     * @return {@link List}<{@link Holiday}>
     */
    public static List<Holiday> listYear(boolean ignoreHoliday, String date) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("ignoreHoliday", ignoreHoliday)
                .build();
        return API.get("/holiday/list/year/" + date, params, List.class, Holiday.class);
    }

    /**
     * 获取指定年份的指定类型节假日及万年历信息
     *
     * @param date          查询的月份 格式 yyyy （只有年份）
     * @param type          需要查询的类型{可选值：类型 workday 工作日 holiday 节假日 rest 休息日 festival 节日
     * @param ignoreHoliday 是否忽略节假日，仅仅获取万年历，默认值false
     * @return {@link List}<{@link Holiday}>
     */
    public static List<Holiday> listYearRest(boolean ignoreHoliday, String date, HolidayType type) {
        Map<String, Object> params = MapUtil.<String, Object>builder()
                .put("type", type)
                .put("ignoreHoliday", ignoreHoliday)
                .build();
        return API.get("/holiday/list/year/" + date + "/rest", params, List.class, Holiday.class);
    }

    /**
     * 获取最近前后七个节日信息
     *
     * @return {@link List}<{@link Festival}>
     */
    public static List<Festival> recentList() {
        return API.get("/holiday/recent/list", MapUtil.empty(), List.class, Festival.class);
    }
}
